﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace MIAPWEB.Common
{

    /// <summary>
    /// Clase que centraliza las distintas URL's de navegación de las páginas de la aplicación.
    /// </summary>
    public static class AppUrls
    {
        #region Campos

        /// <summary>
        /// Diccionario de relación entre URL's padre y URL's hijas.
        /// </summary>
        private static List<Tuple<string, string, string>> urlsRelationshipsDictionary = new List<Tuple<string, string, string>>();

        #endregion

        #region URL's de Páginas

        /// <summary>
        /// URL del archivo de validacion XsdMIAP
        /// </summary>
        public const string XsdMIAP = "SchemaXSD\\XMLSchemaValidacionMIAP.xsd";

        /// <summary>
        /// URL de la pagina de inicio de sesión de la aplicación.
        /// </summary>
        public const string Login = "~/Login.aspx";

        /// <summary>
        /// URL de la pagina de descarga de errores.
        /// </summary>
        public const string DescargaErrores = "~/Downloads/DownloadError.ashx";

        /// <summary>
        /// URL de la pagina maestra de la aplicación.
        /// </summary>
        public const string Master = "~/Main.Master";

        /// <summary>
        /// URL de la pagina de inicio de la aplicación.
        /// </summary>
        public const string Default = "~/Default.aspx";

        /// <summary>
        /// URL de la pagina de error de inicio del login.
        /// </summary>
        public const string ErrorLogin = "~/FormsErrores/ErrorLogin.aspx";

        /// <summary>
        /// URL de la pagina de error de permisos.
        /// </summary>
        public const string ErrorPermisos = "~/FormsErrores/ErrorPermisos.aspx";

        /// <summary>
        /// URL de la pagina sesion terminada por inactividad.
        /// </summary>
        public const string SessionTimeOut = "~/FormsErrores/SessionTimeOut.aspx";

        /// <summary>
        /// Url de la pagina de adminsitrar proyectos.
        /// </summary>
        public const string AdministrarProyectos = "~/Forms/AdministraProyecto.aspx";

        /// <summary>
        /// Url de la pagina de alta de  proyectos.
        /// </summary>
        public const string AltaProyectos = "~/Forms/AltaProyecto.aspx";

        /// <summary>
        /// Url de la pagina de administrar archivos.
        /// </summary>
        public const string AdministrarArchivos = "~/Forms/AdministraArchivo.aspx";

        /// <summary>
        /// Url de la pagina alta de archivos.
        /// </summary>
        public const string AltaArchivos = "~/Forms/AltaArchivo.aspx";

        /// <summary>
        /// Url de la pagina administrar perfiles.
        /// </summary>
        public const string AdministrarPerfiles = "~/Forms/AdministraPerfil.aspx";

        /// <summary>
        /// Url de la página Alta de perfiles.
        /// </summary>
        public const string AltaPerfiles = "~/Forms/AltaPerfil.aspx";

        /// <summary>
        /// Url de la página de administracion de perfiles  de usuarios.
        /// </summary>
        public const string AdministraPerfilesUsuario = "~/Forms/AdministraPerfilesUsuario.aspx";

        /// <summary>
        /// Url de la página de alta de perfiles de usuarios
        /// </summary>
        public const string AltaPerfilesUsuario = "~/Forms/AltaPerfilesUsuario.aspx";

        /// <summary>
        /// Url de la página de administracion de usuarios.
        /// </summary>
        public const string AdministraUsuario = "~/Forms/AdministraUsuario.aspx";

        /// <summary>
        /// Url de la página de alta de usuarios
        /// </summary>
        public const string AltaUsuario = "~/Forms/AltaUsuario.aspx";

        /// <summary>
        /// Url de la página de carga de Archivos
        /// </summary>
        public const string CargaArchivos = "~/Forms/CargaArchivo.aspx";

        /// <summary>
        /// Url de la pagina de ejecucion de proyectos
        /// </summary>
        public const string EjecucionProyectos = "~/Forms/EjecutaProyecto.aspx";

        /// <summary>
        /// Url de la pagina de actualizacion de version valida
        /// </summary>
        public const string ActualizacionVersionValida = "~/Forms/ActualizaVersion.aspx";

        /// <summary>
        /// Url de la página de solicitud de recarga de archivos.
        /// </summary>
        public const string SolicitudRecargaArchivo = "~/Forms/SolicitaRecarga.aspx";

        /// <summary>
        /// Url de la página de atencion de las solicitudes de recarga de archivos.
        /// </summary>
        public const string AtencionSolicitudRecargaArchivo = "~/Forms/AtiendeSolicitud.aspx";

        /// <summary>
        /// Url de la pagina consulta de cargas y ejecucion de proyectos.
        /// </summary>
        public const string ConsultaCargasEjecucionProyectos = "~/Forms/ConsultaCargaEjecucion.aspx";

        /// <summary>
        /// Url de la pagina de consulta de cargass de proyectos.
        /// </summary>
        public const string ConsultaCargasProyecto = "~/Forms/ConsultaCargaProyecto.aspx";

        /// <summary>
        /// Url de la página de consulta de ejecucion de proyectos.
        /// </summary>
        public const string ConsultaEjecucionProyecto = "~/Forms/ConsultaEjecucionProyecto.aspx";

        #endregion

        #region Asociación entre URL's padre y URL's hijas

        /// <summary>
        /// Construye el diccionario de relación entre URL's padre y URL's hijas.
        /// </summary>        
        /// <remarks>
        /// Cada relación entre URL's padre y URL's hijas esta compuesta por: 
        /// 1.- URL mediante la cual se comprobara el acceso.
        /// 2.- URL principal.
        /// 3.- URL hija.
        /// </remarks>
        private static void BuildUrlsRelationshipsDictionary()
        {
            // URL's hijas .
            AddNewUrlRelationship(AdministrarProyectos, AdministrarProyectos, AltaProyectos);
            AddNewUrlRelationship(AdministrarArchivos, AdministrarArchivos, AltaArchivos);
            AddNewUrlRelationship(AdministrarPerfiles, AdministrarPerfiles, AltaPerfiles);
            AddNewUrlRelationship(AdministraPerfilesUsuario, AdministraPerfilesUsuario, AltaPerfilesUsuario);
            AddNewUrlRelationship(AdministraUsuario, AdministraUsuario, AltaUsuario);
        }

        #endregion

        #region Otros

        #region Metodos Privados

        /// <summary>
        /// Agrega una nueva relación al diccionario de relación entre URL's padre y URL's hijas.
        /// </summary>
        /// <param name="urlPermission">URL mediante la cual se validara el permiso de acceso.</param>
        /// <param name="urlParent">URL padre que refiere a la URL hija.</param>
        /// <param name="urlChild">URL hija.</param>
        /// <param name="canBeInverse">Determina si la relación padre-hija se agregara de forma inversa tambien.</param>
        private static void AddNewUrlRelationship(string urlPermission, string urlParent, string urlChild, bool canBeInverse = false)
        {
            urlsRelationshipsDictionary.Add(new Tuple<string, string, string>(urlPermission, urlParent, urlChild));

            if (canBeInverse)
            {
                urlsRelationshipsDictionary.Add(new Tuple<string, string, string>(urlPermission, urlChild, urlParent));
            }
        }

        #endregion

        #region Metodos publicos

        /// <summary>
        /// Obtiene el diccionario de relación entre URL's padre y URL's hijas.
        /// </summary>
        /// <returns>Una lista conteniendo el diccionario de relación entre URL's padre y URL's hijas.</returns>        
        public static List<Tuple<string, string, string>> GetUrlsRelationshipsDictionary()
        {
            if (urlsRelationshipsDictionary.Count == 0)
            {
                BuildUrlsRelationshipsDictionary();
            }

            return urlsRelationshipsDictionary;
        }

        #endregion

        #endregion
    }
}